package views.mediators {
  import com.axon.base.helpers.AxUtils;
  import com.axon.base.managers.AxPopUpManager;
  import com.axon.dataservices.helpers.AxDSUtils;
  import com.axon.mvc.helpers.AxVerbs;
  import com.axon.mvc.patterns.mediator.AxMediator;

  import flash.display.DisplayObject;

  import helpers.Verbs;

  import models.vo.Analise;
  import models.vo.Exigencia;
  import models.vo.Foto;
  import models.vo.Pleito;
  import models.vo.SetorEconomico;
  import models.vo.Vistoria;

  import mx.collections.Sort;
  import mx.collections.SortField;
  import mx.collections.XMLListCollection;
  import mx.controls.Alert;
  import mx.events.CloseEvent;
  import mx.utils.StringUtil;

  import org.restfulx.Rx;

  import views.components.PleitoPropAnaliseView;

  public class PleitoPropAnaliseMediator extends AxMediator {
    private var alert:Alert;

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function PleitoPropAnaliseMediator(viewComponent:DisplayObject) {
      super(viewComponent);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get view():PleitoPropAnaliseView {
      return this.viewComponent as PleitoPropAnaliseView;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    override protected function initialize():void {
      regResponseInterest(Analise, [Verbs.REGISTRAR_ANALISE]);
      regResponseInterest(Vistoria, [Verbs.REGISTRAR_ANALISE]);
      regResponseInterest(Foto, [AxVerbs.LIST, AxVerbs.CREATE, AxVerbs.UPDATE, AxVerbs.DELETE]);
      regResponseInterest(Exigencia, [AxVerbs.LIST, AxVerbs.CREATE, AxVerbs.UPDATE, AxVerbs.DELETE]);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventViewCreated(body:Object):void {
      if (body == view.vboxFotos) {
        view.service.url = Rx.httpRootUrl + 'vistorias/' + view.vistoria.id + '/fotos.fxml';
        view.service.send();
      } else if (body == view.tabResultado) {
        var pleito:Pleito = Pleito(view.vo);
        var setorEconomico:SetorEconomico = (view && view.analise && view.analise.setorEconomico) ? view.analise.setorEconomico : null;
        view.selectedSetor = setorEconomico ? AppFacade.getInstance().models.setoresEconomicos.withId(setorEconomico.id) as SetorEconomico : null;
        if (pleito.getIncentivo().mnemonic != "red_75_irpj")
          view.accResultado.removeChild(view.accChildResultadoCapacidadeRealProducao);
        if (pleito.getIncentivo().mnemonic == "red_75_irpj")
          view.accResultado.removeChild(view.accChildResultadoSetorEconomico);
        if (pleito.getIncentivo().mnemonic != "reinvestimento_30_irpj") {
          view.accResultado.removeChild(view.accChildResultadoInvestimentos);
          view.accResultado.removeChild(view.accChildResultadoDepositos);
        }
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventDataChange(body:Object):void {
      if (body == view.tabVistoria) {

        view.pbVistoriaSalvar.enabled = view.allowEdition;
        view.pbVistoriaDescartar.enabled = view.allowEdition;
      }

      else if (body == view.tabResultado) {

        view.pbResultadoSalvar.enabled = view.allowEdition;
        view.pbResultadoDescartar.enabled = view.allowEdition;
      }

      else if (body == view.tabExigencias) {

        view.errorString = "";
        view.pbExigenciaSalvar.enabled = view.allowEdition;
        view.pbExigenciaDescartar.enabled = view.allowEdition;
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventDiscard(body:Object):void {
      if (body == view.tabVistoria) {

        cloneVistoria();
        view.pbVistoriaSalvar.enabled = false;
        view.pbVistoriaDescartar.enabled = false;
      }

      else if (body == view.tabResultado) {

        cloneAnalise();
        view.pbResultadoSalvar.enabled = false;
        view.pbResultadoDescartar.enabled = false;
      }

      else if (body == view.tabExigencias) {

        if (view.selectedExigencia.id == null)
          cleanDiscardedNewExigencia();

        view.pbExigenciaSalvar.enabled = false;
        view.pbExigenciaDescartar.enabled = false;

        view.pbExigenciasNova.enabled = true;
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventRegistrarAnalise(body:Object):void {
      if (body == view.tabVistoria) {

        view.vistoria.analiseProcessoProdutivo = (view.txtArVistoriaAnaliseProcessoProdutivo) ? view.txtArVistoriaAnaliseProcessoProdutivo.text : view.vistoria.analiseProcessoProdutivo;

        view.vistoria.informacoesComplementares = (view.txtArVistoriaInformacoesComplementares) ? view.txtArVistoriaInformacoesComplementares.text : view.vistoria.informacoesComplementares;

        view.vistoria.conclusao = (view.txtArVistoriaConclusao) ? view.txtArVistoriaConclusao.text : view.vistoria.conclusao;

        view.vistoria.dataRodape = (view.dtVistoriaDataRodape) ? view.dtVistoriaDataRodape.selectedDate : view.vistoria.dataRodape;

        callController(Vistoria, Verbs.REGISTRAR_ANALISE, view.vistoria);
      }

      else if (body == view.tabResultado) {

        if (Pleito(view.vo).getIncentivo().mnemonic != "red_75_irpj" && Pleito(view.vo).getIncentivo().mnemonic != "red_12_5_irpj") {

          if (!view.cmbSetorEconomico.selectedItem) {
            AxPopUpManager.messageDlg('Informe o setor econômico para o pleito.', 'Erro');
            return;
          } else if (StringUtil.trim(view.txtProdutoEnquadramento.text) == '') {
            AxPopUpManager.messageDlg('Informe o enquadramento no setor econômico para o pleito.', 'Erro');
            return;
          }
        }

        view.analise.setorEconomico = view.cmbSetorEconomico.selectedItem as SetorEconomico;

        view.analise.enquadramento = view.txtProdutoEnquadramento.text;

        view.analise.capacidadeRealProducao = (view.txtArResultadoCapacidadeRealProducao) ? view.txtArResultadoCapacidadeRealProducao.text : view.analise.capacidadeRealProducao;

        view.analise.investimentos = (view.txtArResultadoInvestimentos) ? view.txtArResultadoInvestimentos.text : view.analise.investimentos;

        view.analise.depositos = (view.txtArResultadoDepositos) ? view.txtArResultadoDepositos.text : view.analise.depositos;

        view.analise.informacoesComplementares = (view.txtArResultadoInformacoesComplementares) ? view.txtArResultadoInformacoesComplementares.text : view.analise.informacoesComplementares;

        view.analise.parecer = (view.txtArResultadoParecer) ? view.txtArResultadoParecer.text : view.analise.parecer;

        view.analise.condicoesAtendidas = (view.txtArResultadoCondicoesAtendidas) ? view.txtArResultadoCondicoesAtendidas.text : view.analise.condicoesAtendidas;

        view.analise.dataRodape = (view.dtResultadoDataRodape) ? view.dtResultadoDataRodape.selectedDate : view.analise.dataRodape;

        callController(Analise, Verbs.REGISTRAR_ANALISE, view.analise);
      }

    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventSelectionChange(body:Object):void {
      switch (body) {

        case view.tileFotos:

          view.selectedFoto = (view.tileFotos.selectedItem as XML);
          view.pbFotosEdit.enabled = (view.tileFotos.selectedItem && view.allowEdition);
          view.pbFotosDelete.enabled = (view.tileFotos.selectedItem && view.allowEdition);
          view.pbFotosAmpliar.enabled = (view.tileFotos.selectedItem);

          break;

        case view.adgExigencias:

          view.selectedExigencia = (view.adgExigencias.selectedItem as Exigencia);

          if ((view.pbExigenciaExcluir) && (view.pbExigenciaExcluir.visible)) {
            view.pbExigenciasNova.enabled = (!view.selectedExigencia) || (view.selectedExigencia.id != null);
            view.pbExigenciaExcluir.enabled = (view.selectedExigencia && view.allowEdition && (view.selectedExigencia.id != null));
            view.pbExigenciaDescartar.enabled = (view.selectedExigencia) && (view.selectedExigencia.id == null);
            view.pbExigenciaSalvar.enabled = view.pbExigenciaDescartar.enabled;
          }

          if (view.selectedExigencia && (view.selectedExigencia.id != null))
            cleanDiscardedNewExigencia();

          break;
      }
    }

    private function cleanDiscardedNewExigencia():void {
      var exigencia:Exigencia = view.adgExigencias.axItemWithId(null) as Exigencia;
      view.adgExigencias.axRemoveItemWithId(null);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventNew(body:Object):void {
      switch (body) {

        case view.tabFotos:

          callController(Foto, AxVerbs.NEW_POPUP, view.vistoria, view);
          break;

        case view.tabExigencias:

          var exigencia:Exigencia = new Exigencia();

          exigencia.analise = Pleito(view.vo).getAnalise();
          exigencia.titulo = 'Nova exigência';
          Pleito(view.vo).getAnalise().exigencias.addItem(exigencia);
          view.adgExigencias.axSelectItemWithId(null);
          view.txtExigenciaTitulo.setFocus();
          view.txtExigenciaTitulo.setSelection(0, 1000);
          //callController(Exigencia, AxVerbs.NEW, exigencia);

          break;

      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventEdit(body:Object):void {
      switch (body) {

        case view.tabFotos:

          var foto:Foto = new Foto();

          foto.id = view.selectedFoto.id.toString();
          foto.legenda = view.selectedFoto.legenda.toString();
          foto.url = view.selectedFoto.url.toString();
          foto.urlSmall = view.selectedFoto.url_small.toString();
          foto.vistoria = view.vistoria;

          callController(Foto, AxVerbs.EDIT_POPUP, foto, view);

          break;

      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventSave(body:Object):void {
      switch (body) {

        case view.tabExigencias:

          if (StringUtil.trim(view.txtExigenciaTitulo.text) == "") {
            view.errorString = "O título da exigência deve ser preenchido.";
            return
          }

          if (StringUtil.trim(view.txtArExigenciaDescricao.text) == "") {
            view.errorString = "A descrição da exigência deve ser preenchida.";
            return
          }

          if (StringUtil.trim(view.txtArExigenciaJustificativa.text) == "") {
            view.errorString = "A justificativa da exigência deve ser preenchida.";
            return
          }

          if (!view.dtExigenciaPrazo.selectedDate) {
            view.errorString = "O prazo para atendimento da exigência deve ser preenchido.";
            return
          }

          if ((!view.selectedExigencia || view.selectedExigencia.id == null) && (view.dtExigenciaPrazo.selectedDate < AxUtils.currentDate())) {
            view.errorString = "O prazo para atendimento da exigência deve ser posterior à data de hoje.";
            return
          }

          var exigencia:Exigencia = AxDSUtils.clone(view.selectedExigencia) as Exigencia;

          exigencia.analise = Pleito(view.vo).getAnalise();
          exigencia.titulo = view.txtExigenciaTitulo.text;
          exigencia.descricao = view.txtArExigenciaDescricao.text;
          exigencia.justificativa = view.txtArExigenciaJustificativa.text;
          exigencia.formalizacao = view.txtArExigenciaFormalizacao.text;
          exigencia.atendimento = view.txtArExigenciaAtendimento.text;
          exigencia.prazo = view.dtExigenciaPrazo.selectedDate;
          exigencia.baixa = view.dtExigenciaBaixa.selectedDate;
          exigencia.atendidaParcialmente = view.cbAtendidaParcialmente.selected;

          callController(Exigencia, AxVerbs.SAVE, exigencia);

          break;
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventFocusIn(body:Object):void {
      switch (body) {

        case view.txtArVistoriaConclusao:

          if (StringUtil.trim(view.vistoria.conclusao) == "") {
            view.vistoria.conclusao = Pleito(view.vo).conclusaoVistoria;
            eventDataChange(view.tabVistoria);
          }
          break;

        case view.txtArResultadoInvestimentos:

          if (StringUtil.trim(view.analise.investimentos) == "") {
            view.analise.investimentos = Pleito(view.vo).investimentosAnalise;
            eventDataChange(view.tabResultado);
          }
          break;

        case view.txtArResultadoDepositos:

          if (StringUtil.trim(view.analise.depositos) == "") {
            view.analise.depositos = Pleito(view.vo).depositosAnalise;
            eventDataChange(view.tabResultado);
          }
          break;

        case view.txtArResultadoInformacoesComplementares:

          if (StringUtil.trim(view.analise.informacoesComplementares) == "") {
            view.analise.informacoesComplementares = Pleito(view.vo).informacoesComplementaresAnalise;
            eventDataChange(view.tabResultado);
          }
          break;

        case view.txtArResultadoParecer:

          if (StringUtil.trim(view.analise.parecer) == "") {
            view.analise.parecer = Pleito(view.vo).parecerAnalise;
            eventDataChange(view.tabResultado);
          }
          break;

        case view.txtArResultadoCondicoesAtendidas:

          if (StringUtil.trim(view.analise.condicoesAtendidas) == "") {
            view.analise.condicoesAtendidas = Pleito(view.vo).condicoesAtendidasAnalise;
            eventDataChange(view.tabResultado);
          }
          break;
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventDelete(body:Object):void {
      switch (body) {

        case view.tabFotos:

          alert = AxPopUpManager.messageDlg("Tem certeza que quer excluir definitivamente esta foto da Vistoria?", "Confirmação de Exclusão",
            (Alert.YES | Alert.NO), view, confirmDeleteFotoClose, null, Alert.NO);
          break;

        case view.tabExigencias:

          alert = AxPopUpManager.messageDlg("Tem certeza que quer excluir definitivamente esta exigência?", "Confirmação de Exclusão",
            (Alert.YES | Alert.NO), view, confirmDeleteExigenciaClose, null, Alert.NO);
          break;
      }
    }

    public function confirmDeleteFotoClose(event:CloseEvent):void {
      if (event.detail == Alert.YES) {

        var foto:Foto = new Foto();

        foto.id = view.selectedFoto.id.toString();
        callController(Foto, AxVerbs.DELETE, foto);
      }
    }

    public function confirmDeleteExigenciaClose(event:CloseEvent):void {
      if (event.detail == Alert.YES) {

        var exigencia:Exigencia = new Exigencia();

        exigencia.id = view.selectedExigencia.id.toString();
        callController(Exigencia, AxVerbs.DELETE, exigencia);
      }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventAmpliarFoto():void {
      var foto:Foto = new Foto();

      foto.id = view.selectedFoto.id.toString();
      foto.legenda = view.selectedFoto.legenda.toString();
      foto.url = view.selectedFoto.url.toString();
      foto.urlSmall = view.selectedFoto.url_small.toString();
      foto.vistoria = view.vistoria;

      callController(Foto, AxVerbs.READ_POPUP, foto, view);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respVistoriaRegistrarAnaliseSuccess(sender:Object, body:Object, extraInfo:Object):void {
      var vistoria:Vistoria = Pleito(view.vo).getAnalise().getVistoria();

      vistoria.analiseProcessoProdutivo = Vistoria(body).analiseProcessoProdutivo;
      vistoria.informacoesComplementares = Vistoria(body).informacoesComplementares;
      vistoria.conclusao = Vistoria(body).conclusao;
      vistoria.dataRodape = Vistoria(body).dataRodape;

      view.pbVistoriaSalvar.enabled = false;
      view.pbVistoriaDescartar.enabled = false;
    }

    public function respVistoriaRegistrarAnaliseFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha no registro da vistoria (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respAnaliseRegistrarAnaliseSuccess(sender:Object, body:Object, extraInfo:Object):void {
      var analise:Analise = Pleito(view.vo).getAnalise();

      analise.setorEconomico = Analise(body).setorEconomico;
      analise.enquadramento = Analise(body).enquadramento;
      analise.capacidadeRealProducao = Analise(body).capacidadeRealProducao;
      analise.investimentos = Analise(body).investimentos;
      analise.depositos = Analise(body).depositos;
      analise.informacoesComplementares = Analise(body).informacoesComplementares;
      analise.parecer = Analise(body).parecer;
      analise.condicoesAtendidas = Analise(body).condicoesAtendidas;
      analise.dataRodape = Analise(body).dataRodape;

      view.pbResultadoSalvar.enabled = false;
      view.pbResultadoDescartar.enabled = false;
    }

    public function respAnaliseRegistrarAnaliseFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha no registro do resultado da análise (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respFotoListSuccess(sender:Object, body:Object, extraInfo:Object):void {
    }

    public function respFotoListFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na leitura das fotos (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respFotoCreateSuccess(sender:Object, body:Object, extraInfo:Object):void {
      view.tileIndexMemo = XMLListCollection(view.tileFotos.dataProvider).length;
      view.tileFotos.dataProvider = null;
      view.service.send();
      view.tileFotos.dataProvider = view.service.lastResult.foto;
    }

    public function respFotoCreateFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na gravação da nova foto (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respFotoUpdateSuccess(sender:Object, body:Object, extraInfo:Object):void {
      view.tileIndexMemo = view.tileFotos.selectedIndex;
      view.tileFotos.dataProvider = null;
      view.service.send();
      view.tileFotos.dataProvider = view.service.lastResult.foto;
    }

    public function respFotoUpdateFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na gravação das modificações (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respFotoDeleteSuccess(sender:Object, body:Object, extraInfo:Object):void {
      view.tileFotos.dataProvider = null;
      view.service.send();
      view.tileFotos.dataProvider = view.service.lastResult.foto;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respFotoDeleteFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na exclusão da nova foto (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respExigenciaCreateSuccess(sender:Object, body:Object, extraInfo:Object):void {
      view.adgExigencias.axRemoveItemWithId(null);
      sortExigencias();
      view.adgExigencias.axSelectItemWithId(Exigencia(body).id);
      view.pbExigenciaDescartar.enabled = false;
      view.pbExigenciaSalvar.enabled = false;
    }

    public function respExigenciaCreateFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na gravação da nova Exigencia (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respExigenciaUpdateSuccess(sender:Object, body:Object, extraInfo:Object):void {
      //view.adgExigencias.axReplaceSelectedItem(body);
      sortExigencias();
      //view.adgExigencias.axSelectItemWithId(Exigencia(body).id);
      view.pbExigenciaSalvar.enabled = false;
      view.pbExigenciaDescartar.enabled = false;
    }

    public function respExigenciaUpdateFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na gravação das modificações (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respExigenciaDeleteSuccess(sender:Object, body:Object, extraInfo:Object):void {
//			view.adgExigencias.axRemoveItem(body);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respExigenciaDeleteFailure(sender:Object, body:Object, extraInfo:Object):void {
      view.errorString = "Falha na exclusão da nova Exigencia (provavelmente algum problema no servidor).";
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    private function cloneVistoria():void {
      view.vistoria = AxDSUtils.clone(Pleito(view.vo).getAnalise().getVistoria()) as Vistoria;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    private function cloneAnalise():void {
      view.analise = AxDSUtils.clone(Pleito(view.vo).getAnalise()) as Analise;
    }

    private function sortExigencias():void {
      var sort:Sort = new Sort();
      sort.fields = [new SortField('titulo', true)];
      Pleito(view.vo).getAnalise().getExigencias().sort = sort;
      Pleito(view.vo).getAnalise().getExigencias().refresh();

    }

  }
}